home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 208_01 / e3.c < prev    next >
Text File  |  1987-10-11  |  6KB  |  270 lines

  1. /*
  2. HEADER:        CUG208;
  3. TITLE:        'e' for CP/M68K
  4. VERSION:    1.48+
  5.  
  6. DESCRIPTION:    "a screen editor";
  7.  
  8. KEYWORDS:    editor;
  9. SYSTEM:        CP/M68K, V1.2;
  10. FILENAME:    e/e3.c
  11. WARNINGS:    "the default value is for systems with 128K bytes
  12.          of memory or more";
  13. SEE-ALSO:    cpm68k.c, e68k.doc, CUG VOL 133;
  14. AUTHORS:    G.N.Gilbert('e'), J.W.Haefner(for DeSmet C on MSDOS and UNIX)
  15. CODER:        Yoshimasa Tsuji
  16. COMPILERS:    DRI C(Alcyon C) for CP/M68K;
  17. */
  18. /*
  19.     FUNCTIONS: putline,putoffset,putstatusline,ptlineno,,putpage,
  20.             putmess,unmess,putstr,rewrite,calcoffset,resetcursor
  21.     PURPOSE: write text to screen
  22. */
  23.  
  24. # include "e.h"
  25.  
  26. putline(line,y)
  27. int line, y;
  28. {
  29.     register char *p;
  30.     register int cp, lastcol, off, x, nblank;
  31.     int    bright;
  32.  
  33.     deleteline(0,y);
  34.     if (line <= lastl) {
  35.         bright= !hilight || line == cline;
  36.         if (blocking && !bright)
  37.             bright = to ? (line >= from && line <= to):
  38.                 (line >= (from > cline ? cline : from) &&
  39.                     line <= (from > cline ? from  : cline));
  40.         lastcol=SWIDTH;
  41.         off=x=0;
  42.         p=getline(line);
  43.         if ( (line == cline && calcoffset()) || (blockscroll && offset) ) {
  44.             lastcol+=offset-1;
  45.             off=offset;
  46.             x=1;
  47.             standout();
  48.             putch('<');
  49.             standend();
  50.         }
  51.  
  52.         if (!bright) standout(), isdim = YES;
  53.  
  54.         for (cp=nblank=0; *p && cp < lastcol; p++) {
  55.             if (*p == '\t')
  56.             do {
  57.                 if (cp >= off && cp < lastcol)
  58.                     nblank++;
  59.             }
  60.             while (++cp % tabwidth);
  61.             else {
  62.                 if (cp++ >= off) {
  63.                     if (*p == ' ') nblank++;
  64.                     else {
  65.                         if (nblank) {
  66.                             x+=nblank;
  67.                             if (nblank < GOTOLEN)
  68.                                 for (; nblank; nblank--)
  69.                                     putch(' ');
  70.                             else {
  71.                                 gotoxy(x,y);
  72.                                 nblank=0;
  73.                             }
  74.                         }
  75.                         dispch(*p);
  76.                         x++;
  77.                     }
  78.                 }
  79.             }
  80.         }
  81.         if (*p && y < SHEIGHT) {
  82.             makeother();
  83.             gotoxy(SWIDTH,y);
  84.             putch('>');
  85.         }
  86.         standend();
  87.         isdim = NO;
  88.     }
  89. }
  90.  
  91. putoffset()
  92. {
  93.     register int i;
  94.  
  95.     gotoxy(0,0);
  96.     if (offset) for(i=3-uspr(offset); i>0; i--) putch(' ');
  97.     else putstr("   ");
  98.     gotoxy(0,cursory);
  99. }
  100.  
  101. putstatusline(line)
  102. int line;
  103. {
  104.     deleteline(FNPOS,0);
  105.     standout();
  106.     putstr(filename);
  107.     ptlineno(line);
  108.     standend(); isdim = NO;
  109.     if (errmess) {
  110.         gotoxy(EMPOS,0);
  111.         putstr(errmess);
  112.     }
  113. }
  114.  
  115. ptlineno(line)
  116. int line;
  117. {
  118.     int i;
  119.  
  120.     if (!displaypos) return;
  121.     gotoxy(LNPOS,0);
  122.     standout();
  123.     i=uspr(line);
  124.     putch(':');
  125.     for (i=8-i-uspr(cursorx+1); i > 0; i--) putch(' ');
  126.     standend();
  127.     isdim = NO;
  128. }
  129.  
  130. putpage()    /*display page more or less centered about 'cline'*/
  131. {
  132.     register int y,line;
  133.  
  134.     pfirst= loc(cline,(topline-SHEIGHT)/2);
  135.     plast = loc(pfirst,SHEIGHT-topline);
  136.     putstatusline(cline);
  137.     for (line=pfirst, y=topline; line <= plast; line++, y++) {
  138.         if (cline == line) {
  139.             cursory = y;
  140.             adjustc(cursorx);
  141.         }
  142.         putline(line,  y);
  143.     }
  144.     if (y <= SHEIGHT) delpage(y);
  145. }
  146.  
  147. putmess(message)
  148. char *message;
  149. {
  150.     register int lines;
  151.  
  152.     if (blankedmess && topline > blankedmess) {
  153.         gotoxy(3,blankedmess++);
  154.         putstr(message);
  155.         return;
  156.     }
  157.  
  158.     lines = (topline == (helpon ? HELPLINES : 1)) ? 2:1;
  159.     if (cursory < (topline+=lines)) {
  160.         gotoxy(0,cursory);
  161.         for ( ; cursory < topline; cursory++) {
  162.             insertline();
  163.             if (plast != lastl) plast--;
  164.         }
  165.     }
  166.     else pfirst+= lines;
  167.     deleteline(0,topline-2);
  168.     deleteline(0,topline-1);
  169.     gotoxy(3,topline-2);
  170.     putstr(message);
  171. }
  172.  
  173. unmess()
  174. {
  175.     register int l, i, newtop, diff;
  176.  
  177.     newtop= (helpon ? HELPLINES : 1);
  178.     if (!(diff=topline-newtop)) return;
  179.     if (diff < PAGEOVERLAP && pfirst-diff < 1) {
  180.         if (blankedmess == newtop) return;
  181.         for (l=newtop; l < topline; l++) deleteline(0,l);
  182.         blankedmess=newtop;
  183.         return;
  184.     }
  185.     blankedmess=NO;
  186.     if ((pfirst-=diff) < 1) {
  187.         topline=newtop;
  188.         putpage();
  189.     }
  190.     else {
  191.         for (l=newtop, i=0; l < topline; l++, i++) putline(pfirst+i,l);
  192.         topline=newtop;
  193.     }
  194. }
  195.  
  196. putstr(s)        /*as usual, but turns text bright or dim as required*/
  197. char *s;
  198. {
  199.     register int dim, c;
  200.  
  201.     dim=NO;
  202.     while (c= *s++)
  203.         switch(c) {
  204.         case BRIDIM :
  205.             (dim=!dim) ? standout() : standend();
  206.             break;
  207.             /*        case '\n':
  208.                         putch('\r');
  209.              */
  210.         default  :
  211.             putch(c);
  212.         }
  213.     if (dim) standend();
  214.     isdim = NO;
  215. }
  216.  
  217. rewrite(cp,x)    /*rewrites current line from char 'cp', col 'x', onwards*/
  218. register int cp, x;
  219. {
  220.     register int i, begmark, c;
  221.  
  222.     begmark= (calcoffset() > 0);
  223.     i= x-offset+begmark;
  224.     deleteline((i>0 ? i : 0),cursory);
  225.     if (!x && begmark) {
  226.         standout();
  227.         putch('<');
  228.         standend();
  229.         isdim = NO;
  230.     }
  231.     while (x < SWIDTH+offset-begmark && (c=text[cp++])) {
  232.         if (c == '\t') {
  233.             for (i=tabwidth-x%tabwidth; i>0 && x<SWIDTH+offset-begmark; x++, i--)
  234.                 if (x >= offset) putch(' ');
  235.         }
  236.         else if (x++ >= offset) dispch(c);
  237.     }
  238.     if (c && cursory < SHEIGHT) {
  239.         standout();
  240.         putch('>');
  241.         standend();
  242.         isdim = NO;
  243.     }
  244. }
  245.  
  246. calcoffset()        /*calculate horizontal screen offset required for
  247.             cursor to be on screen*/
  248. {
  249.     for (offset=(!blockscroll || cursorx < lastoff ? 0 : lastoff);
  250.         cursorx >= SWIDTH+offset-(offset>0); offset+=OFFWIDTH);
  251.         return(offset);
  252. }
  253.  
  254. resetcursor()        /*put cursor on current character, coping with
  255.             horizontal scroll */
  256. {
  257.     register int line, y;
  258.  
  259.     if (lastoff != calcoffset()) {
  260.         if (blockscroll) {
  261.             for (line=pfirst, y=topline; line <= plast; line++, y++)
  262.                 if (line != cline) putline(line,y);
  263.         }
  264.         putoffset();
  265.         rewrite(0,0);
  266.         lastoff=offset;
  267.     }
  268.     gotoxy(cursorx-offset+(offset>0),cursory);
  269. }
  270.